package com.pond.pond.service.impl;

import com.pond.common.core.utils.DateUtils;
import com.pond.pond.domain.AppVersion;
import com.pond.pond.domain.dto.CheckUpdateRequest;
import com.pond.pond.mapper.AppVersionMapper;
import com.pond.pond.service.IAppVersionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * App版本信息Service业务层处理
 */
@Service
public class AppVersionServiceImpl implements IAppVersionService {
    
    @Autowired
    private AppVersionMapper appVersionMapper;

    /**
     * 查询App版本信息
     *
     * @param id App版本信息主键
     * @return App版本信息
     */
    @Override
    public AppVersion selectAppVersionById(Long id) {
        return appVersionMapper.selectAppVersionById(id);
    }

    /**
     * 查询App版本信息列表
     *
     * @param appVersion App版本信息
     * @return App版本信息
     */
    @Override
    public List<AppVersion> selectAppVersionList(AppVersion appVersion) {
        return appVersionMapper.selectAppVersionList(appVersion);
    }

    /**
     * 新增App版本信息
     *
     * @param appVersion App版本信息
     * @return 结果
     */
    @Override
    public int insertAppVersion(AppVersion appVersion) {
        appVersion.setCreateTime(DateUtils.getNowDate());
        return appVersionMapper.insertAppVersion(appVersion);
    }

    /**
     * 修改App版本信息
     *
     * @param appVersion App版本信息
     * @return 结果
     */
    @Override
    public int updateAppVersion(AppVersion appVersion) {
        appVersion.setUpdateTime(DateUtils.getNowDate());
        return appVersionMapper.updateAppVersion(appVersion);
    }

    /**
     * 批量删除App版本信息
     *
     * @param ids 需要删除的App版本信息主键
     * @return 结果
     */
    @Override
    public int deleteAppVersionByIds(Long[] ids) {
        return appVersionMapper.deleteAppVersionByIds(ids);
    }

    /**
     * 删除App版本信息信息
     *
     * @param id App版本信息主键
     * @return 结果
     */
    @Override
    public int deleteAppVersionById(Long id) {
        return appVersionMapper.deleteAppVersionById(id);
    }

    /**
     * 检查版本更新
     *
     * @param request 检查更新请求
     * @return 更新检查结果
     */
    @Override
    public Map<String, Object> checkUpdate(CheckUpdateRequest request) {
        Map<String, Object> result = new HashMap<>();
        
        // 查询最新版本
        AppVersion latestVersion = appVersionMapper.selectLatestVersion();
        
        if (latestVersion == null) {
            result.put("needUpdate", false);
            result.put("message", "暂无可用版本");
            return result;
        }
        
        // 只比较版本号，不比较buildNumber
        // 版本号相同则认为不需要更新，版本号更高才需要更新
        boolean needUpdate = compareVersions(request.getCurrentVersion(), latestVersion.getVersionCode()) < 0;
        
        result.put("needUpdate", needUpdate);
        
        if (needUpdate) {
            // 需要更新
            Map<String, Object> latestVersionInfo = new HashMap<>();
            latestVersionInfo.put("versionCode", latestVersion.getVersionCode());
            latestVersionInfo.put("versionName", latestVersion.getVersionName());
            // 移除buildNumber，只关注版本号
            // latestVersionInfo.put("buildNumber", latestVersion.getBuildNumber());
            latestVersionInfo.put("fileName", latestVersion.getFileName());
            latestVersionInfo.put("fileSize", latestVersion.getFileSize());
            latestVersionInfo.put("fileSizeMB", latestVersion.getFileSizeMB());
            latestVersionInfo.put("fileMd5", latestVersion.getFileMd5());
            latestVersionInfo.put("downloadUrl", latestVersion.getDownloadUrl());
            latestVersionInfo.put("updateDescription", latestVersion.getUpdateDescription());
            latestVersionInfo.put("releaseTime", latestVersion.getCreatedAt());
            
            Map<String, Object> updateInfo = new HashMap<>();
            updateInfo.put("isForceUpdate", isForceUpdate(request.getCurrentVersion(), latestVersion.getMinSupportedVersion()));
            updateInfo.put("minSupportedVersion", latestVersion.getMinSupportedVersion());
            
            result.put("latestVersion", latestVersionInfo);
            result.put("updateInfo", updateInfo);
        } else {
            // 无需更新
            result.put("currentVersion", request.getCurrentVersion());
            result.put("message", "当前已是最新版本");
        }
        
        return result;
    }

    /**
     * 发布新版本
     *
     * @param appVersion 版本信息
     * @return 结果
     */
    @Override
    @Transactional
    public int publishVersion(AppVersion appVersion) {
        // 简化：不再自动生成buildNumber，由前端或管理员指定
        // 如果没有指定buildNumber，设置为1
        if (appVersion.getBuildNumber() == null || appVersion.getBuildNumber() <= 0) {
            appVersion.setBuildNumber(1);
        }
        
        // 设置为活跃状态
        appVersion.setIsActive(true);
        appVersion.setCreateTime(DateUtils.getNowDate());
        
        // 插入新版本
        int result = appVersionMapper.insertAppVersion(appVersion);
        
        // 如果设置为最新版本，清除其他版本的最新标记
        if (appVersion.getIsLatest() != null && appVersion.getIsLatest()) {
            appVersionMapper.clearAllLatestFlags();
            appVersionMapper.setAsLatestVersion(appVersion.getId());
        }
        
        return result;
    }

    /**
     * 设置为最新版本
     *
     * @param id 版本ID
     * @return 结果
     */
    @Override
    @Transactional
    public int setAsLatestVersion(Long id) {
        // 清除所有最新版本标记
        appVersionMapper.clearAllLatestFlags();
        // 设置指定版本为最新版本
        return appVersionMapper.setAsLatestVersion(id);
    }

    /**
     * 查询最新版本
     *
     * @return 最新版本信息
     */
    @Override
    public AppVersion selectLatestVersion() {
        return appVersionMapper.selectLatestVersion();
    }

    /**
     * 查询活跃版本列表
     *
     * @return 版本列表
     */
    @Override
    public List<AppVersion> selectActiveVersions() {
        return appVersionMapper.selectActiveVersions();
    }

    /**
     * 比较版本号
     *
     * @param version1 版本1
     * @param version2 版本2
     * @return 比较结果：负数表示version1 < version2，0表示相等，正数表示version1 > version2
     */
    private int compareVersions(String version1, String version2) {
        if (version1 == null || version2 == null) {
            return 0;
        }
        
        // 如果版本号完全相同，直接返回0
        if (version1.equals(version2)) {
            return 0;
        }
        
        // 分割版本号
        String[] parts1 = version1.split("\\.");
        String[] parts2 = version2.split("\\.");
        
        int maxLength = Math.max(parts1.length, parts2.length);
        
        for (int i = 0; i < maxLength; i++) {
            int num1 = i < parts1.length ? parseVersionPart(parts1[i]) : 0;
            int num2 = i < parts2.length ? parseVersionPart(parts2[i]) : 0;
            
            if (num1 != num2) {
                return Integer.compare(num1, num2);
            }
        }
        
        return 0;
    }
    
    /**
     * 解析版本号部分，提取数字
     */
    private int parseVersionPart(String part) {
        if (part == null || part.isEmpty()) {
            return 0;
        }
        
        // 提取数字部分，忽略非数字字符
        StringBuilder numStr = new StringBuilder();
        for (char c : part.toCharArray()) {
            if (Character.isDigit(c)) {
                numStr.append(c);
            } else {
                break; // 遇到非数字字符就停止
            }
        }
        
        try {
            return numStr.length() > 0 ? Integer.parseInt(numStr.toString()) : 0;
        } catch (NumberFormatException e) {
            return 0;
        }
    }

    /**
     * 判断是否强制更新
     *
     * @param currentVersion 当前版本
     * @param minSupportedVersion 最低支持版本
     * @return 是否强制更新
     */
    private boolean isForceUpdate(String currentVersion, String minSupportedVersion) {
        if (minSupportedVersion == null) {
            return false;
        }
        return compareVersions(currentVersion, minSupportedVersion) < 0;
    }
}